package com.hspedu.generic;

/**
 * @Author Stringzhua
 * @Date 2024/3/13 21:21
 * description:
 */
public class Generic03 {
    public static void main(String[] args) {
        //注意E的具体数据类型在定义Person对象的时候指定的,即在编译期间就确定了E是什么类型

        Person<String> person1 = new Person<String>("爪爪吃蒸饺");
        person1.show();//class java.lang.String
        /*
        * 可以这样理解,上面的Person类
        class Person{
            String s;//E表示s的数据类型,该数据类型是在定义Person对象的时候指定的,即在编译期间就确定了E是什么类型

            public Person(String s) {//E也可以是参数类型
                this.s = s;
            }

            public String f() {//返回类型使用E
                return s;
            }
        }

        * */
        Person<Integer> person2 = new Person<>(100);
        person2.show();//class java.lang.Integer
        /*
        class Person{
            Integer s;//E表示s的数据类型,该数据类型是在定义Person对象的时候指定的,即在编译期间就确定了E是什么类型

            public Person(Integer s) {//E也可以是参数类型
                this.s = s;
            }

            public Integer f() {//返回类型使用E
                return s;
            }
        }

        * */
    }
}

//泛型的作用是:可以在类声明时通过一个标记表示类中某个属性的类型
//或者是某个方法返回值的类型,或者是参数类型
class Person<E> {
    //    String s;
    E s;//E表示s的数据类型,该数据类型是在定义Person对象的时候指定的,即在编译期间就确定了E是什么类型

    public Person(E s) {//E也可以是参数类型
        this.s = s;
    }

    public E f() {//返回类型使用E
        return s;
    }
    public void show(){
        System.out.println(s.getClass());//显示s的运行类型
    }
}
